package GUI;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.net.SocketException;
import java.net.URI;
import java.net.URISyntaxException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.logging.Logger;

import javax.crypto.EncryptedPrivateKeyInfo;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;

import org.apache.commons.lang.math.RandomUtils;

import Tools.Encryptor;
import Tools.Tools;

public class Registrazione extends JFrame {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	protected Registrazione self;
	protected JPanel contentPane;
	protected Main mainWindow;
	protected JTextArea chiaveAttivazione;
	
	Registrazione(Main caller){
		try{
			JOptionPane.showMessageDialog(null,"Attenzione!!\nScollegare tutti i dispositivi esterni collegati al PC (Chiavette USB, stampanti ect.)","Licenza iRor",JOptionPane.WARNING_MESSAGE);
			self=this;
			mainWindow=caller;
			mainWindow.frmRorscoring.setVisible(false);
			setMinimumSize(new Dimension(300, 200));
			setPreferredSize(new Dimension(1000, 400));
			setTitle("Registrazione I-Ror");
			setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
			setBounds(100, 100, 1000, 600);
			setIconImage(Tools.createImage("Icons/Logo.png"));
			contentPane = new JPanel();
			contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
			contentPane.setLayout(null);
			setContentPane(contentPane);
			
			JLabel lblCodicePC = new JLabel("Codice PC:");
			lblCodicePC.setBounds(100, 100, 200, 25);
			lblCodicePC.setFont(new Font("Book Antiqua", Font.PLAIN, 20));
			contentPane.add(lblCodicePC);
			JTextField codicePC = new JTextField(Encryptor.getPCCode());
			codicePC.setEditable(false);
			codicePC.setBounds(300, 100, 300, 25);
			codicePC.setFont(new Font("Book Antiqua", Font.PLAIN, 20));
			contentPane.add(codicePC);
			JLabel lblChiaveAttivazione = new JLabel("Chiave Attivazione:");
			lblChiaveAttivazione.setBounds(100, 150, 200, 25);
			lblChiaveAttivazione.setFont(new Font("Book Antiqua", Font.PLAIN, 20));
			contentPane.add(lblChiaveAttivazione);
			chiaveAttivazione = new JTextArea();
			chiaveAttivazione.setBounds(300, 150, 600, 100);
			chiaveAttivazione.setLineWrap(true);
			chiaveAttivazione.setFont(new Font("Book Antiqua", Font.PLAIN, 20));
			contentPane.add(chiaveAttivazione);
			JLabel lblIstruzioni = new JLabel("<html>Per attivare il prodotto, trascrivere il codice PC riportato sopra e seguire le istruzioni per ricevere la chiave di attivazione nel sito dell' Istituro Rorschach Forense.<br>Una volta ottenuta la chiave di attivazione incollarla nell'area sopra e premere il pulsante \"Registra\"</html>");
			lblIstruzioni.setBounds(100, 275, 800, 125);
			lblIstruzioni.setFont(new Font("Book Antiqua", Font.PLAIN, 20));
			contentPane.add(lblIstruzioni);
			
			JButton btnRegistra=new JButton("Registra");
			btnRegistra.setFont(new Font("Book Antiqua", Font.PLAIN, 18));
			btnRegistra.setBounds(100, 400, 200, 40);
			contentPane.add(btnRegistra);
			
			JButton btnSito=new JButton("Vai al sito");
			btnSito.setFont(new Font("Book Antiqua", Font.PLAIN, 18));
			btnSito.setBounds(400, 400, 200, 40);
			contentPane.add(btnSito);
			
			JButton btnAnnulla=new JButton("Annulla");
			btnAnnulla.setFont(new Font("Book Antiqua", Font.PLAIN, 18));
			btnAnnulla.setBounds(700, 400, 200, 40);
			contentPane.add(btnAnnulla);
			
			btnSito.addActionListener(new ActionListener() {
				
				@Override
				public void actionPerformed(ActionEvent e) {
					try {
						java.awt.Desktop.getDesktop().browse(new URI("http://www.rorschachforense.it/"));
					} catch (IOException e1) {
						JOptionPane.showMessageDialog(contentPane,"Errore nell'apertura del sito.\nErrore: "+e1.getMessage(),"Errore",JOptionPane.ERROR_MESSAGE);
						mainWindow.frmRorscoring.setVisible(true);
						mainWindow.frmRorscoring.dispatchEvent(new WindowEvent(mainWindow.frmRorscoring, WindowEvent.WINDOW_CLOSING));
					} catch (URISyntaxException e1) {
						JOptionPane.showMessageDialog(contentPane,"Errore nell'apertura del sito.\nErrore: "+e1.getMessage(),"Errore",JOptionPane.ERROR_MESSAGE);
						mainWindow.frmRorscoring.setVisible(true);
						mainWindow.frmRorscoring.dispatchEvent(new WindowEvent(mainWindow.frmRorscoring, WindowEvent.WINDOW_CLOSING));
					}
				}
			});
			
			btnAnnulla.addActionListener(new ActionListener() {
				
				@Override
				public void actionPerformed(ActionEvent e) {
					mainWindow.frmRorscoring.setVisible(true);
					mainWindow.frmRorscoring.dispatchEvent(new WindowEvent(mainWindow.frmRorscoring, WindowEvent.WINDOW_CLOSING));
				}
			});

			btnRegistra.addActionListener(new ActionListener() {
				
				@Override
				public void actionPerformed(ActionEvent e) {
				   	File f = new File("license.lic");
					try {
						f.delete();
						BufferedWriter write=new BufferedWriter(new FileWriter(f));
						write.write(chiaveAttivazione.getText());
						write.close();
						int a=RandomUtils.nextInt(100);
						int b=RandomUtils.nextInt(100);
						String[] licenza=Encryptor.checkLicenza(a, b);			
						if ((Integer.parseInt(licenza[0]))!=a+b){
							Main.showError("Licenza non valida:\n"+licenza[1]);			
							return;
						}
						if(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").parse(licenza[4]).getTime()<new Date().getTime()){
							Main.showError("Licenza scaduta.");			
							return;
						}
						ArrayList<String> codes;
						String textCodes="";
						try {
							codes = Encryptor.getAllCodes();
							for (String code :codes){
								textCodes+=code+"\n";
							}
						} catch (SocketException e1) {
						}
						Main.logger.info("Registrazione Effettuata\n"+textCodes);
						ArrayList<String> codici= Encryptor.getAllCodes();
						String output="*";
						for( int i=0; i<codici.size();i++){
							output+=codici.get(i)+"*";
						}
						//File registerLog = new File(new JFileChooser().getFileSystemView().getDefaultDirectory().getAbsolutePath()+"/I-Ror/register.log");
						//BufferedWriter writeLog=new BufferedWriter(new FileWriter(f));
						//writeLog.write(output.getBytes());
						//write.close();
						JOptionPane.showMessageDialog(contentPane,"Licenza attivata.\nRiavviare l'applicazione","Attivazione",JOptionPane.INFORMATION_MESSAGE);
						
					} catch (Exception e1) {
						JOptionPane.showMessageDialog(contentPane,"Errore nella verifica della licenza.\nRiavviare l'applicazione e riprovare\nErrore: "+e1.getLocalizedMessage(),"Errore",JOptionPane.ERROR_MESSAGE);						
					}
				}
			});

			addWindowListener(new WindowListener() {
				
				@Override
				public void windowOpened(WindowEvent e) {
					// TODO Auto-generated method stub
					
				}
				
				@Override
				public void windowIconified(WindowEvent e) {
					// TODO Auto-generated method stub
					
				}
				
				@Override
				public void windowDeiconified(WindowEvent e) {
					// TODO Auto-generated method stub
					
				}
				
				@Override
				public void windowDeactivated(WindowEvent e) {
					// TODO Auto-generated method stub
					
				}
				
				@Override
				public void windowClosing(WindowEvent e) {
					// TODO Auto-generated method stub
					
				}
				
				@Override
				public void windowClosed(WindowEvent e) {
					mainWindow.frmRorscoring.setVisible(true);
					mainWindow.frmRorscoring.dispatchEvent(new WindowEvent(mainWindow.frmRorscoring, WindowEvent.WINDOW_CLOSING));
				}
				
				@Override
				public void windowActivated(WindowEvent e) {
					// TODO Auto-generated method stub
					
				}
			});
			
		}catch(Exception e){
			JOptionPane.showMessageDialog(contentPane,"Errore nella creazione della licenza\nContattare il supporto tecnico.\nErrore:"+e.getMessage(),"Errore",JOptionPane.ERROR_MESSAGE);
			mainWindow.frmRorscoring.setVisible(true);
			mainWindow.frmRorscoring.dispatchEvent(new WindowEvent(mainWindow.frmRorscoring, WindowEvent.WINDOW_CLOSING));
		}
	}


}
